package leetcode.slidingWindow;

import java.util.Arrays;
import java.util.List;
import java.util.Scanner;
import java.util.stream.Collectors;

/**
 * leetCode 209
 *  Minimum Size Subarray Sum
 *  滑动窗口
 * 翻译：和大于某个值的最短子序列
 * 思路：
 * 如果当前窗口内的和sum < s我们就往右边扩一个位置，并且维护窗口的和sum的值，但是要考虑R已经到达边界的情况，此时我们可以break了，因为就算L再往右边，也没用，因为此时sum < s；
 否则我们的窗口就左边缩一个，并且继续维护sum；
 然后我们要做的就是不断的记录窗口的长度 R - L + 1的最小值；

 */
public class SlidingWindow209 {

    public static void main(String []args){
        int [] nums = {2,3,1,2,4,3};
        int s = 7;
        System.out.print(new SlidingWindow209().minSubArrayLen(s, nums));
    }
    public int minSubArrayLen(int s, int[] nums) {
        int l = 0, r = -1;
        int sum = 0;
        int res = nums.length + 1;
        while (r < nums.length){
            if (sum < s){
                if( ++ r == nums.length) break;
                sum += nums[r];
            } else{
                sum -= nums[l++];
            }
            if(sum >= s){
                res = res > (r - l + 1)? (r - l + 1): res;
            }
        }
        if (res == nums.length + 1) return 0;
        return res;
    }
}
